package LeeJS;

public class J21_AccessModifier {
	
	/*
			
			캡슐화(encapsulation)와 접근 제어
			OOP의 원칙에서 캡슐화는 개체의 일부를 "보호"하고
			노출해도 상관없는 부분을 노출했을 때에는 "안전"해야 한다는 매커니즘
			
			예를 들어, 텔레비젼은 캡슐화의 좋은 예임
			텔레비젼의 수많은 부품들은 케이스 안에 놓아둠
			클래스 개발자는 변수와 메서드들을 외부로 부터 감추어 두는 것이 좋음
			
			자바는 접근 제어를 통해 캡슐화를 지원함
			접근 제어는 접근 제어 수정자에 의해 통제 받음
			4가지 접근 제어 수정자가 존재 함(public, protected, private, default(10% 정도만씀))
			
			private : 자신만 접근 가능, 그 외에는 접근 불가
			protected : 상속관계의 클래스만 접근 가능
			public : 어디서나 접근 가능함을 의미
			default : 기본 패키지 내 클래스들끼리만 접근 가능
			
			클래스에 적용 : public default 만 가능
			멤버변수에 적용 : public, protected, private, default
			메서드에 적용 : public, protected, private, default
			
			결론
			OOP의 캡슐화 원칙에 따라 클래스의 멤버변수들은 무조건 private 선언
			클래스의 메서드들은 오픈하고 싶을 경우는 public 으로 선언 하고
			그 외에 경우에는 protected 으로 선언한다.
			
			
	 */
	
	public static void main(String[] args) {
		
		/*
		
				default 클래스 불러오기 실패
				default 패키지에 선언된 클래스는 같은 패키지내에 존재하는 클래스만이 접근가능
				즉, LeeJS 패키지에서 default 패키지에 있는 클래스로 접근이 안됨
				J21_DefaultClass dfc = new J21_DefaultClass();
		
				J21_PublicClass 클래스가 public 이라 하더라도 default 패키지 내에 있으므로 접근 불가
				J21_PublicClass pbc = new J21_PublicClass ();
				
				*/
				

		J21_PublicClass pbc = new J21_PublicClass();
		J21_PublicClass pbc2 = new J21_PublicClass();
		//J21_PublicClass 클래스는 public 이기 때문에 어떤 패키지라도 접근 가능
		
		LeeJS.J21_PublicClass pbc3 = new J21_PublicClass();		//현재 패키지에 있는 클래스 앞에 패키지는 안써도 상관이 없다
		
		excercise.J21_PublicClass pbc4 = new excercise.J21_PublicClass();	//다른 패키지에 있는 클래스
		
		//클래스의 멤버변수에 접근
		//같은 패키지 내의 멤버변수 접근
		
		pbc3.defautval = 1;
		pbc3.publicval = 2;
		//pbc3.privateval = 3;	//privateval 이라서 접근 불가
		
		
		
		//다른 패키지에서의 멤버변수 접근
		
		pbc4.defautval = 1;		//같은 패키지에서만 접근 가능
		pbc4.publicval = 2;		//패키지가 달라도 접근 가능
		pbc4.privateval = 3;	//위와 동일
		
		
		//같은 패키지에서의 메서드 접근
		
		pbc3.defaultMethod();
		pbc3.publicmethod();
		pbc3.privateMethod();	//위와 동일
		
		//다른 패키지에서의 메서드 접근
		
		pbc4.defaultMethod();	//위와 동일
		pbc4.publicmethod();
		pbc4.privateMethod();	//위와 동일
		
		
		
		
		
	}

}
